/**
 * 日志工具
 * 使用pino作为日志记录器
 */
const pino = require('pino');
const path = require('path');
const fs = require('fs');
const util = require('util');

// 确保控制台输出使用UTF-8编码
if (process.stdout.isTTY) {
  process.stdout.setDefaultEncoding('utf8');
  process.stderr.setDefaultEncoding('utf8');
}

// 确保日志目录存在
const logDir = path.join(process.cwd(), 'logs');
if (!fs.existsSync(logDir)) {
  fs.mkdirSync(logDir, { recursive: true });
}

// 创建日志文件流，指定UTF-8编码
const streams = [
  { stream: process.stdout },
  { 
    stream: fs.createWriteStream(path.join(logDir, 'app.log'), { 
      flags: 'a',
      encoding: 'utf8'  // 明确指定UTF-8编码
    }) 
  }
];

// 为开发环境配置pretty打印
const devTransport = pino.transport({
  target: 'pino-pretty',
  options: {
    colorize: true,
    translateTime: 'SYS:standard',
    ignore: 'pid,hostname',
    messageFormat: '{msg}',  // 简单格式化避免编码问题
    singleLine: false,
    errorProps: '*'
  }
});

// 创建日志记录器
const logger = pino(
  {
    level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
    timestamp: pino.stdTimeFunctions.isoTime,
    base: {
      pid: process.pid,
      hostname: process.env.HOSTNAME || 'localhost'
    },
    formatters: {
      level: (label) => {
        return { level: label };
      }
    },
    messageKey: 'message',  // 指定消息键
    nestedKey: 'data',      // 指定嵌套数据键
    serializers: {          // 添加序列化器，避免对象的错误编码
      err: pino.stdSerializers.err,
      error: pino.stdSerializers.err
    }
  },
  process.env.NODE_ENV === 'production' 
    ? pino.multistream(streams) 
    : devTransport
);

// 添加安全日志方法
logger.security = (message, data) => {
  logger.warn({ type: 'SECURITY', message, data });
};

// 保存原始console方法
const originalConsole = {
  log: console.log,
  error: console.error,
  warn: console.warn,
  info: console.info,
  debug: console.debug
};

// 格式化参数为字符串
const formatArgs = (args) => {
  return args.map(arg => {
    if (typeof arg === 'object') {
      try {
        return util.inspect(arg, { showHidden: false, depth: null, colors: false });
      } catch (e) {
        return String(arg);
      }
    }
    return String(arg);
  }).join(' ');
};

// 覆盖console方法，保留原始参数并同时输出到控制台和日志
console.log = (...args) => {
  const message = formatArgs(args);
  logger.info(message);
  // 开发环境同时输出到原始console
  if (process.env.NODE_ENV !== 'production') {
    originalConsole.log(...args);
  }
};

console.error = (...args) => {
  const message = formatArgs(args);
  logger.error(message);
  // 始终输出错误到原始console
  originalConsole.error(...args);
};

console.warn = (...args) => {
  const message = formatArgs(args);
  logger.warn(message);
  if (process.env.NODE_ENV !== 'production') {
    originalConsole.warn(...args);
  }
};

console.info = (...args) => {
  const message = formatArgs(args);
  logger.info(message);
  if (process.env.NODE_ENV !== 'production') {
    originalConsole.info(...args);
  }
};

console.debug = (...args) => {
  const message = formatArgs(args);
  logger.debug(message);
  if (process.env.NODE_ENV !== 'production') {
    originalConsole.debug(...args);
  }
};

module.exports = logger; 